package cn.itcast.solrj;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.junit.Before;
import org.junit.Test;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import cn.itcast.pojo.Item;
import cn.itcast.util.HttpClientUtil;

public class SolrjTest {

    private ObjectMapper mapper = new ObjectMapper();

    private HttpSolrServer server;

    @Before
    public void init() {
        server = new HttpSolrServer("http://solr.taotao.com/taotao");
        // 设置最大重试次数，不推荐超过1次
        server.setMaxRetries(1);
        // 设置连接超时时间
        server.setConnectionTimeout(500);
    }

    @Test
    public void query() throws IOException, SolrServerException {
        // 搜索的关键词
        String keyword = "*";
        // 分页参数：
        int page = 1;// 当前页
        int rows = 5;// 每页大小
        // 查询条件
        SolrQuery query = new SolrQuery("title:" + keyword);
        // 设置过滤条件,只要上架的商品
        query.setFilterQueries("status:1");
        // 设置分页,page至少要>=1
        query.setStart((Math.max(page, 1) - 1) * rows);
        query.setRows(rows);

        // 判断是否需要高亮
        boolean isHighlight = StringUtils.isNotEmpty(keyword) && !StringUtils.equals("*", keyword);

        if (isHighlight) {
            // 开启高亮
            query.setHighlightSimplePre("<em>");
            query.setHighlightSimplePost("</em>");
            query.addHighlightField("title");
        }
        // 查询并获取响应
        QueryResponse response = server.query(query);
        // 获取非高亮结果
        List<Item> items = response.getBeans(Item.class);

        System.out.println("本次共搜索到"+response.getResults().getNumFound()+"条数据：");
        if (isHighlight) {
            // 获取高亮结果
            Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
            for (Item item : items) {
                Long id = item.getId();
                System.out.println("id: " + id);
                item.setTitle(highlighting.get(id + "").get("title").get(0));

                System.out.println("title:" + item.getTitle());
                System.out.println("price: " + item.getPrice());

                System.out.println(item);
            }
        }
    }

    @Test
    public void loadData() throws Exception {
        // 后台查询商品的接口，每次查100条，分页 查询
        String url = "http://manage.taotao.com/rest/item?page={page}&rows=100";
        // 当前页
        int page = 1;
        // 当前页的实际 数量
        int pageSize = 0;
        do {
            // 将地址中的page替换为正确的页码
            String uri = url.replace("{page}", String.valueOf(page));
            // 发起请求，获取数据
            String jsonData = HttpClientUtil.doGet(uri);
            if (jsonData != null) {
                JsonNode jsonNode = mapper.readTree(jsonData);
                // 返回的数据是一个EasyUIResult格式，我们获取其中的rows
                String arrStr = jsonNode.get("rows").toString();
                // 转为集合
                List<Item> items = mapper.readValue(arrStr,
                        mapper.getTypeFactory().constructCollectionType(List.class, Item.class));
                // 获取当前页的实际数据条数
                pageSize = items.size();
                // 将数据提交到SolrServer
                server.addBeans(items);
                server.commit();
                page++;
            }
        } while (pageSize == 100);
    }
}
